package java_thinking.unit_18_IO._18_10;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Desc:   产生可读、可写、即可读又可写的通道
 *          ByteBuffer :与通道交互的缓冲器
 *          ByteBuffer.wrap():将已存在的字节数组“包装”到ByteBuffer中，这样就不用再复制底层的数组，而是把它作为所产生的
 *                              ByteBuffer的存储器。我们称之为数组支持的ByteBuffer；
 * @author: cww
 * @DateTime: 2019/5/17 8:29
 */

public class GetChannel {
    private static final  int BSIZE = 1024;
    private static String file = "src/maindemo/java/java_thinking/unit_18_IO/_18_10/GetChannel.txt";
    public static void main(String[] args) throws IOException {
        FileChannel fc = new FileOutputStream(file).getChannel();
        fc.write(ByteBuffer.wrap("Some text ".getBytes()));
        fc.close();
        //在上面的文件尾部添加内容
        fc = new RandomAccessFile(file,"rw").getChannel();
        //移动到尾部
        fc.position(fc.size());
        fc.write(ByteBuffer.wrap("Some more".getBytes()));
        fc.close();
        //读取上面操作后的文件
        fc = new FileInputStream(file).getChannel();
        //为了能够快速移动大量数据明确分配ByteBuffer尺寸
        ByteBuffer buff = ByteBuffer.allocate(BSIZE);
        fc.read(buff);
        //使用read(buff)后必须调用缓冲器上的flip()。让缓冲器做好让别人读取字节的准备
        buff.flip();
        while (buff.hasRemaining()) {
            System.out.print((char)buff.get());
        }
    }
}
